#include "pagenumberformatter.h"
#include <QRegularExpression>
#include <QRegularExpressionMatch>
// 支持的占位符定义
const QStringList PageNumberFormatter::SUPPORTED_PLACEHOLDERS = {
    "{page}",    // 全局页码（默认）
    "{total}",   // 总页数
    "{global}"   // 全局页码（明确指定）
};
// 预设格式和描述
const QList<QPair<QString, QString>> PageNumberFormatter::PRESET_FORMATS = {
    {"{page}", "简单页码 (如: 25)"},
    {"{page}/{total}", "页码/总数 (如: 25/100)"},
    {"第{page}页", "中文格式 (如: 第25页)"},
    {"- {page} -", "装饰格式 (如: - 25 -)"},
    {"Page {page}", "英文格式 (如: Page 25)"},
    {"{page} of {total}", "英文完整格式 (如: 25 of 100)"}
};
QString PageNumberFormatter::format(const FormatContext& context)
{
    // 验证输入
    if (context.format.isEmpty()) {
        return QString::number(context.globalPage);
    }
    if (context.globalPage <= 0 || context.totalPages <= 0) {
        return "1";
    }
    // 执行格式化
    QString result = performSubstitution(context.format, context);
    return result;
}
QStringList PageNumberFormatter::getPresetFormats()
{
    QStringList formats;
    for (const auto& pair : PRESET_FORMATS) {
        formats.append(pair.first);
    }
    return formats;
}
bool PageNumberFormatter::isValidFormat(const QString& format)
{
    if (format.isEmpty()) {
        return false;
    }
    // 检查是否包含至少一个支持的占位符
    bool hasValidPlaceholder = false;
    for (const QString& placeholder : SUPPORTED_PLACEHOLDERS) {
        if (format.contains(placeholder)) {
            hasValidPlaceholder = true;
            break;
        }
    }
    if (!hasValidPlaceholder) {
        // 如果没有任何占位符，检查是否为纯文本（也是有效的）
        return !format.contains(QRegularExpression("\\{[^}]*\\}"));
    }
    // 检查是否只包含支持的占位符
    return containsOnlySupportedPlaceholders(format);
}
QString PageNumberFormatter::getFormatDescription(const QString& format)
{
    // 查找预设格式的描述
    for (const auto& pair : PRESET_FORMATS) {
        if (pair.first == format) {
            return pair.second;
        }
    }
    // 生成动态描述
    if (isValidFormat(format)) {
        return QString("自定义格式: %1").arg(generatePreview(format));
    } else {
        return "无效格式";
    }
}
QString PageNumberFormatter::generatePreview(const QString& format,
                                            int sampleGlobal,
                                            int sampleTotal)
{
    FormatContext context(sampleGlobal, sampleTotal, format);
    return PageNumberFormatter::format(context);
}
QString PageNumberFormatter::performSubstitution(const QString& format, const FormatContext& context)
{
    QString result = format;
    // 按照优先级顺序进行替换（避免替换冲突）
    // 1. 处理明确的全局页码占位符
    result.replace("{global}", QString::number(context.globalPage));
    // 2. 处理总页数占位符
    result.replace("{total}", QString::number(context.totalPages));
    // 3. 处理默认页码占位符（默认为全局页码）
    result.replace("{page}", QString::number(context.globalPage));
    return result;
}
bool PageNumberFormatter::containsOnlySupportedPlaceholders(const QString& format)
{
    // 查找所有占位符
    QRegularExpression placeholderRegex("\\{[^}]*\\}");
    QRegularExpressionMatchIterator iterator = placeholderRegex.globalMatch(format);
    while (iterator.hasNext()) {
        QRegularExpressionMatch match = iterator.next();
        QString placeholder = match.captured(0);
        if (!SUPPORTED_PLACEHOLDERS.contains(placeholder)) {
            return false;
        }
    }
    return true;
}